perm filename T2.F4[M11,LCS]3 blob
sn#409418 filedate 1979-01-13 generic text, type T, neo UTF8
00100 C THIS ROUTINE FINDS KEY WORDS IN I ARRAY AND PUTS THEIR KEY NUMS
00200 C INTO THE IX ARRAY. IX ARRAY ADVANCES 2 WORDS AT A TIME.
00300 C IF 2ND WRD OF EACH PAIR IS NON-ZERO THEN 1ST IS FLT. PT. NUM.
00400 C KCNT IS WORD COUNT OF INPUT STRING.
00500 SUBROUTINE MPACK(KCNT, I,IX,IPTR)
00600 INTEGER FQDR
00700 COMMON/IGEN/IGEN /FQDR/FQDR(28,27),INSN
00800 CIN COMMON /TR/Q(80),QX(100),IIX(100),LX(12),INST(27,4),K
00900 COMMON /TR/LX(12),K
01000 DIMENSION I(1),WDS(18)
01100 COMMON /WDZ/WDZ(14),JWD(12)
01200 DATA WDS/'OUT','OSC','AD2','RAN','ENV','STR','AD3','AD4',
01300 1 'MLT','DIV','RAH','END','REV','OPT','NOS','SUB','INP','COS'/,
01400 1 WDZ/'PLAY','FINI','SRAT','NCHN','PRIN','CHA','POWE','SRT',
01500 1 'WORD','GEN','SEG','SIN','INS','UNIT'/,
01600 1 JWD/'C','D','E','F','G','A','B','P','*','/',0,0/
01700 DATA IPP/'P'/,IFF/'F'/,IBB/'B'/,IAA/'A'/,IOO/'O'/,IRR/'R'/,
01800 1 IEE/'E'/,ISS/'S'/,IMM/'M'/,III/'I'/,ILL/'L'/,ITT/'T'/,
01900 1 IDD/'D'/,I2/'2'/,I3/'3'/,I4/'4'/,IUU/'U'/,ICC/'C'/,IHH/'H'/
02000 1,IVV/'V'/,IYY/'Y'/,IWW/'W'/,I0/'0'/,I9/'9'/,INN/'N'/,IQQ/'Q'/
02100 1,IPP/'P'/,IGG/'G'/,ISTAR/'*'/,KSLA/'/'/
02200 IX=I(1)
02300 CC DO 100 K=1,12
02400 C LOOK FOR PUNCTUATION, ARITHMETIC OPERATORS, ETC.
02500 CC100 IF(IX.EQ.LX(K))RETURN
02600 101 N=I(2)
02700 L=I(3)
02800 CALL PACKER(RNAM,I)
02900 C NOW RNAM HAS PACKED WORD
03000 IF(IGEN.NE.2)GO TO 1000
03100 C IGEN=2=READING INSTRUMENT DEFINITION
03200 CODE NUMS ARE 1-13 FOR UNIT GENS., 100+ FOR B, 200+ FOR P, 300+ FOR F.
03300 C ORD. OF UNIT GENS:OUT,OSC,AD2,RAN,ENV,STR,AD3,AD4,MLT,DIV,RAH,END,REV
03400 C OPT,NOS,SUB,INP,COS
03500 C OPT=OPTIONAL, NOS=OSC WHICH ACCEPTS NEG. FREQ., COS=CONTINUING NOS.
03600 IF(IX.EQ.IPP)GO TO 14
03700 IF(IX.EQ.IFF)GO TO 15
03800 IF(IX.EQ.IBB)GO TO 16
03900 IF(IX.EQ.IDD)GO TO 142
04000 C FPN = FREQ. PARAM. NUM. DPN = DUR. PARAM. NUM.
04100 DO 102 IX=1,18
04200 102 IF(RNAM.EQ.WDS(IX))RETURN
04300 C SENDS BACK NUM FOR 1 TO 17
04400 C IF NOT A KNOWN WORD THEN ERROR
04500 999 IF(IGEN.EQ.2)GO TO 28
04600 C SO INST NAME CAN START WITH 'P' (BUT NO 'P12X', ETC.)
04700 CALL ERR(5)
04800
04900 141 JCVT=-1
05000 GO TO 143
05100 142 JCVT=1
05200 143 N=L
05300 L=I(4)
05400 C SHIFT POINTER 1 TO RIGHT
05500 KCNT=KCNT-1
05600 GO TO 144
05700 14 JCVT=0
05800 144 J=200
05900 C PN
06000 18 IF(N.LT.I0.OR.N.GT.I9)GO TO 999
06100 K2=0
06200 K1=NASCI(N)
06400 C CONVERTS ASCII CHAR. TO INTEGER
06500 IF(KCNT.EQ.2)GO TO 19
06600 C ARE THERE 2 DIGITS AFTER P, F OR B?
06700 IF(L.LT.I0.OR.L.GT.I9)GO TO 999
06800 K1=K1*10
07000 K2=NASCI(L)
07100 19 IX=J+K1+K2
07200 IF(JCVT.EQ.0)RETURN
07300 C NOW SET UP A FREQ OR DUR FLAG
07400 FQDR(K1+K2-2,INSN)=JCVT
07500 JCVT=0
07600 RETURN
07700 15 IF(N.EQ.IPP)GO TO 141
07800 C JUMP FOR 'FP' = FREQ PARAM
07900 J=300
08000 C FN
08100 GO TO 18
08200 16 J=100
08300 C BN
08400 GO TO 18
08500
08600 C NEXT FOR OTHER (MUS10 TYPE) KEY WORDS.
08700 1000 IF(KCNT.LT.3)GO TO 2000
08800 C JUMP TO FIND NOTE NAMES, PARAMS, FUNCTS.
08900 DO 1 K=1,15
09000 IF(RNAM.NE.WDZ(K))GO TO 1
09100 C THIS LIST BEGINS WITH CODE NUM. 400:
09200 C PLAY,FINI,SRATE,NCHNS,PRINT,CHA,POWER,SRT,END,GEN,DUR,FREQ,INS,UNIT GEN
09300 IX=K+399
09400 CC IF(K.EQ.9)IX=12
09500 CC IF(K.EQ.15)IX=13
09600 RETURN
09700 1 CONTINUE
09800 IF(IX.EQ.IPP)GO TO 14
09900 C CHECK FOR A PARAM NUM OR INST. NAME
10000 28 IX=-IPTR
10100 C SEND BACK NEG. POINTER TO I ARRAY SO IT WILL LOOK FOR INST. NAME.
10200 RETURN
10300
10400 2000 DO 2 K=1,12
10500 C FINDS (P1, P21, ETC.)
10600 2 IF(IX.EQ.JWD(K))GO TO(5,11,7,4,6,8,9,14,15,16)K
10700 GO TO 28
10800 C A FUNC??
10900 4 IF(N.GE.I0.AND.N.LE.I9)GO TO 15
11000 IF(KCNT.EQ.3)GO TO 28
11100 IX=510
11200 GO TO 36
11300 5 IX=501
11400 C 'C'
11500 C AT THIS POINT NOTE NUMBERS RUN FROM 500 TO 520 (CF TO BS)
11600 GO TO 36
11700 6 IX=513
11800 C THE NOTE 'G'
11900 36 IF(KCNT.EQ.1)RETURN
12000 IF(N.EQ.IFF)GO TO 39
12100 IF(N.NE.ISS) GO TO 28
12200 C NOW IT'S NOT A NOTE
12300 40 IX=IX+1
12400 C SHARP
12500 RETURN
12600 39 IX=IX-1
12700 C FLAT
12800 RETURN
12900 11 IX=504
13000 C 'D'
13100 GO TO 36
13200 7 IF(KCNT.EQ.3)GO TO 4
13300 C 'END' OR NOTE 'E'?
13400 IX=507
13500 GO TO 36
13600 8 IX=516
13700 GO TO 36
13800 9 IX=519
13900 GO TO 36
14000 END
14100
14200 SUBROUTINE ERR(N)
14300 GO TO (1,2,3,4,5)N
14400 1 TYPE 101
14500 STOP
14600 101 FORMAT(' MISSING SEMICOLON')
14700 2 TYPE 102
14800 STOP
14900 102 FORMAT(' MISSING PARENTHESIS')
15000 3 TYPE 103
15100 STOP
15200 103 FORMAT(' MISSING COMMA')
15300 4 TYPE 104
15400 104 FORMAT(' MISSING PLAY;')
15500 5 TYPE 105
15600 105 FORMAT(' UNKNOWN WORD')
15700 STOP
15800 END
15900
16000 SUBROUTINE ARITH(Y,W,LL)
16100 DIMENSION W(1)
16200 COMMON /AR/IOP
16300 7 X=W(LL-1)
16400 GO TO (1,2,3,4,5),IOP
16500 1 IF(Y.EQ.0)Y=16.
16600 C 0 WILL ALWAYS TURN INTO 16 WITH MULT OR DIV.
16700 X=X*Y
16800 GO TO 6
16900 2 IF(Y.EQ.0)Y=16.
17000 X=X/Y
17100 GO TO 6
17200 3 X=X-Y
17300 GO TO 6
17400 4 X=X+Y
17500 GO TO 6
17600 5 X=X**Y
17700 6 W(LL-1)=X
17800 END
17900 SUBROUTINE PACKER(NAM,INP)
18000 DATA IBLA/' '/,ISEMI/';'/,IARO/"575004020100/,IEQU/'='/
18100 C****** THE BIG NUMBER=LEFT ARROW
18200 C11 DOUBLE PRECISION NAM
18300 DIMENSION INP(1),KNM(5)
18400 DATA KK/128/,LL/"377777777777/,JJ/"2000000000/
18500 1 , MM/"774000000000/
18600
18700 NAM=0
18800 DO 1 J=1,80
18900 N=INP(J)
19000 IF(N.EQ.IARO.OR.N.EQ.IEQU)GO TO 2
19100 1 IF(N.EQ.IBLA.OR.N.EQ.ISEMI)GO TO 2
19200 2 II=J
19300 J=J-1
19400 N=J
19500 IF(J.GT.4)N=4
19600 4 DO 10 K=1,4
19700 IF(K.GT.N)GO TO 11
19800 KNM(K)=INP(K)
19900 GO TO 10
20000 11 KNM(K)=IBLA
20100 10 CONTINUE
20200 KNM(5)=IBLA
20300 C ABOVE FOR PDP10 ONLY*********
20400 C N=WDCNT
20500 DO 12 K=5,1,-1
20600 NAM=NAM .OR. (KNM(K) .AND. MM)
20700 IF (K.EQ.1)RETURN
20800 17 IF (NAM.GE.0)GO TO 13
20900 NAM = (( NAM .AND. LL)/KK) .OR. JJ
21000 GO TO 12
21100 13 NAM = NAM / KK
21200 12 CONTINUE
21300
21400 END